package com.sheng.leetcode.year2023.month06.day25;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2023/06/25
 * <p>
 * 1401. 圆和矩形是否有重叠<p>
 * <p>
 * 给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ，<p>
 * 其中 (x1, y1) 是矩形左下角的坐标，而 (x2, y2) 是右上角的坐标。<p>
 * 如果圆和矩形有重叠的部分，请你返回 true ，否则返回 false 。<p>
 * 换句话说，请你检测是否 存在 点 (xi, yi) ，它既在圆上也在矩形上（两者都包括点落在边界上的情况）。<p>
 * <p>
 * 示例 1 ：<p>
 * 输入：radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1<p>
 * 输出：true<p>
 * 解释：圆和矩形存在公共点 (1,0) 。<p>
 * <p>
 * 示例 2 ：<p>
 * 输入：radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1<p>
 * 输出：false<p>
 * <p>
 * 示例 3 ：<p>
 * 输入：radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1<p>
 * 输出：true<p>
 * <p>
 * 提示：<p>
 * 1 <= radius <= 2000<p>
 * -10^4 <= xCenter, yCenter <= 10^4<p>
 * -10^4 <= x1 < x2 <= 10^4<p>
 * -10^4 <= y1 < y2 <= 10^4<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/circle-and-rectangle-overlapping">1401. 圆和矩形是否有重叠</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1401 {

    @Test
    public void test01() {
//        int radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1;
//        int radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1;
        int radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1;
        System.out.println(new Solution().checkOverlap(radius, xCenter, yCenter, x1, y1, x2, y2));
    }
}

class Solution {
    public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        // 可以求出矩形的 x 和 y 的范围为 x1 <= x <= x2 和 y1 <= y <= y2
        // 然后再继续求圆的 x 和 y 的范围
        // 想要坐标 x 和 y 落在圆内，圆心是 (xCenter, yCenter) 半径为 r，需要满足 (x - xCenter)^2 + (y - yCenter)^2 <= r^2
        // 即 x - xCenter 和 y - yCenter 的最小值的平方和是否小余半径的平方
        int a;
        if (x1 <= xCenter && xCenter <= x2) {
            // 点再坐标上
            a = 0;
        } else {
            a = xCenter < x1 ? x1 - xCenter : xCenter - x2;
        }
        int b;
        if (y1 <= yCenter && yCenter <= y2) {
            // 点再坐标上
            b = 0;
        } else {
            b = yCenter < y1 ? y1 - yCenter : yCenter - y2;
        }
        return Math.pow(a, 2) + Math.pow(b, 2) <= Math.pow(radius, 2);
    }
}
